home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 139 / 139.xpi / chrome / imagezoom.jar / content / overlay.js < prev   
Text File  |  2010-02-07  |  38KB  |  891 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  
  3.     Copyright (c) 2006-2010  Jason Adams <imagezoom@yellowgorilla.net>
  4.  
  5.     This file is part of Image Zoom.
  6.  
  7.     Image Zoom is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation; either version 2 of the License, or
  10.     (at your option) any later version.
  11.  
  12.     Image Zoom is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with Image Zoom; if not, write to the Free Software
  19.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20.  
  21.  * ***** END LICENSE BLOCK ***** */
  22.  
  23.  
  24. if (!net) var net = {};
  25. if (!net.yellowgorilla) net.yellowgorilla = {};
  26. if (!net.yellowgorilla.imagezoom) net.yellowgorilla.imagezoom = {};
  27.  
  28. net.yellowgorilla.imagezoom.overlay = new function () {
  29.  
  30.     // Private Global Variables
  31.     // Preference Service objects
  32.     var nsIPrefServiceObj = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  33.     var nsIPrefBranchObj = nsIPrefServiceObj.getBranch("imagezoom.");
  34.  
  35.     var linuxImage;
  36.     var currentImage;
  37.     var currentURL;
  38.     var izContext;
  39.     var contextDisabled = false;
  40.     var imagezoomBundle;
  41.     var contextSubMenuLabel;
  42.     var contextRotateMenuLabel;
  43.     var tmpIzImage;
  44.  
  45.     var minGeckoForRotate = "1.9";
  46.  
  47.     var mousedown = false;
  48.  
  49.     //Public Functions
  50.     this.initImageZoom = function () {
  51.         // Check the version to display initilisation page if appropriate
  52.         var version = net.yellowgorilla.imagezoom.globals.getAppVersion();
  53.         var oldVersion = nsIPrefBranchObj.getCharPref("version");
  54.  
  55.         if (net.yellowgorilla.imagezoom.globals.newerVersion(oldVersion, version)) {
  56.             nsIPrefBranchObj.setCharPref("version", version);
  57.             try {
  58.                 // try to save the prefs
  59.                 nsIPrefServiceObj.savePrefFile(null);
  60.                 setTimeout(function()
  61.                 {
  62.                     if (gBrowser)
  63.                     {
  64.                         gBrowser.selectedTab = gBrowser.addTab('http://imagezoom.yellowgorilla.net/install/?source=install&version=' + version);                        
  65.                     }
  66.                 }, 100);
  67.  
  68.             } catch(e) {
  69.                 //alert(e);
  70.             }
  71.         }
  72.  
  73.         // For Mozilla and Firefox
  74.         if (document.getElementById("contentAreaContextMenu")) {
  75.             document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", imageZoomMenu, false);
  76.         }
  77.         // For Thunderbird
  78.         if (document.getElementById("messagePaneContext")) {
  79.             document.getElementById("messagePaneContext").addEventListener("popupshowing", imageZoomMenu, false);
  80.         }
  81.         // For Thunderbird 3.0+
  82.         if (document.getElementById("mailContext")) {
  83.             document.getElementById("mailContext").addEventListener("popupshowing", imageZoomMenu, false);
  84.         }
  85.         // Add events for the mouse functions
  86.         gPanelContainer().addEventListener("mousedown", izOnMouseDown, true);
  87.  
  88.         imagezoomBundle = document.getElementById("net.yellowgorilla.imagezoom.stringbundle");
  89.  
  90.     }
  91.  
  92.     this.izShowCustomZoom = function () {
  93.         // Create the image object and pass it to the custom zoom dialog
  94.         var oizImage = new izImage(document.popupNode);
  95.         openDialog("chrome://net.yellowgorilla.imagezoom/content/customzoom.xul", "", "chrome,modal,centerscreen", "Image", oizImage);
  96.         reportStatus(oizImage);
  97.     }
  98.  
  99.     this.izShowCustomZoomPage = function () {
  100.         // Create the image object and pass it to the custom zoom dialog
  101.         var zoomManager = ZoomImageManager.prototype.getInstance();
  102.         openDialog("chrome://net.yellowgorilla.imagezoom/content/customzoom.xul", "", "chrome,modal,centerscreen", "Page", zoomManager);
  103.     }
  104.  
  105.     this.izShowCustomDim = function () {
  106.         // Create the image object and pass it to the custom dimension dialog
  107.         var oizImage = new izImage(document.popupNode);
  108.         openDialog("chrome://net.yellowgorilla.imagezoom/content/customdim.xul", "", "chrome,modal,centerscreen", oizImage);
  109.         reportStatus(oizImage);
  110.     }
  111.  
  112.     this.izImageFit = function () {
  113.         // Create the object and invoke its Fit to window method passing the autocenter option
  114.         var oizImage = new izImage(document.popupNode);
  115.         oizImage.fit(nsIPrefBranchObj.getBoolPref("autocenter"));
  116.         reportStatus(oizImage);
  117.     }
  118.  
  119.     this.izZoomIn = function () {
  120.         //Create the object and invoke its zoom method passing the factor to zoom
  121.         var oizImage = new izImage(document.popupNode);
  122.         oizImage.zoom(nsIPrefBranchObj.getIntPref("zoomvalue") / 100);
  123.         reportStatus(oizImage);
  124.     }
  125.  
  126.     this.izZoomOut = function () {
  127.         //Create the object and invoke its zoom method passing the factor to zoom
  128.         var oizImage = new izImage(document.popupNode);
  129.         oizImage.zoom(100 / nsIPrefBranchObj.getIntPref("zoomvalue"));
  130.         reportStatus(oizImage);
  131.     }
  132.  
  133.     this.izSetZoom = function (zFactor) {
  134.         //Create the object and invoke its setZoom method passing the factor to zoom
  135.         var oizImage = new izImage(document.popupNode);
  136.         oizImage.setZoom(zFactor);
  137.         reportStatus(oizImage);
  138.     }
  139.  
  140.     this.izRotateRight = function () {
  141.         var oizImage = new izImage(document.popupNode);
  142.         oizImage.rotate(90);
  143.         tmpIzImage = oizImage;
  144.     }
  145.  
  146.     this.izRotateLeft = function () {
  147.         var oizImage = new izImage(document.popupNode);
  148.         oizImage.rotate(-90);
  149.         tmpIzImage = oizImage;
  150.     }
  151.  
  152.     this.izRotate180 = function () {
  153.         var oizImage = new izImage(document.popupNode);
  154.         oizImage.rotate(180);
  155.         tmpIzImage = oizImage;
  156.     }
  157.  
  158.  
  159.     this.izRotateReset = function () {
  160.         var oizImage = new izImage(document.popupNode);
  161.         oizImage.rotate(0 - oizImage.getAngle());
  162.         tmpIzImage = oizImage;
  163.     }
  164.  
  165.     //Private Functions
  166.  
  167.  
  168.     function getContextSubMenuLabel() {
  169.         if (!contextSubMenuLabel) {
  170.             contextSubMenuLabel = document.getElementById("context-zoomsub").getAttribute("label") + " (%zoom% %)";
  171.         }
  172.  
  173.         return contextSubMenuLabel;
  174.     }
  175.  
  176.  
  177.     function getContextRotateMenuLabel() {
  178.         if (!contextRotateMenuLabel) {
  179.             contextRotateMenuLabel = document.getElementById("context-rotatesub").getAttribute("label") + " (%rotate%\u00B0)";
  180.         }
  181.  
  182.         return contextRotateMenuLabel;
  183.     }
  184.  
  185.     function gPanelContainer() {
  186.         //return document.getElementById("content");
  187.         return window;
  188.     }
  189.  
  190.     function izOnMouseOut(e) {
  191.         if ((e.originalTarget.tagName.toLowerCase() == "html") || (e.originalTarget.tagName.toLowerCase() == "xul:browser")) {
  192.             cancelScrollZoom();
  193.         }
  194.     }
  195.  
  196.     function cancelScrollZoom() {
  197.         if (linuxImage) linuxImage = null;
  198.  
  199.         if (currentImage) currentImage = null;
  200.  
  201.         gPanelContainer().removeEventListener("DOMMouseScroll", ScrollImage, true);
  202.         gPanelContainer().removeEventListener("mouseup", izOnMouseUp, true);
  203.         gPanelContainer().removeEventListener("mouseout", izOnMouseOut, true);
  204.         mousedown = false;
  205.     }
  206.  
  207.     function reportStatus(oizImage) {
  208.         var statusTextFld = "";
  209.         var tmpStatus = ""
  210.         //write the zoom factor to the status bar
  211.         if (document.documentElement.getAttribute("windowtype") == "mail:3pane") {
  212.             statusTextFld = document.getElementById("statusText");
  213.         } else {
  214.             statusTextFld = document.getElementById("statusbar-display");
  215.         }
  216.  
  217.         tmpStatus = "Image Zoom: " + oizImage.zoomFactor() + "% | " + imagezoomBundle.getString("widthLabel") + ": " + oizImage.getWidth() + "px | " + imagezoomBundle.getString("heightLabel") + ": " + oizImage.getHeight() + "px";
  218.         if (net.yellowgorilla.imagezoom.globals.getGeckoVersion() >= minGeckoForRotate) {
  219.             tmpStatus = tmpStatus + " | " + imagezoomBundle.getString("rotateLabel") + ": " + oizImage.getAngle() + "\u00B0"
  220.         }
  221.         statusTextFld.label = tmpStatus;
  222.     }
  223.  
  224.     function CallBackStatus() {
  225.         if (tmpIzImage) {
  226.             reportStatus(tmpIzImage);
  227.             tmpIzImage = null;
  228.         }
  229.     }
  230.  
  231.     function disableContextMenu(e) {
  232.         if (document.popupNode.tagName.toLowerCase() == "img" || document.popupNode.tagName.toLowerCase() == "canvas") {
  233.             linuxImage = document.popupNode;
  234.             izContext = e.originalTarget;
  235.             e.preventDefault();
  236.             contextDisabled = true;
  237.             popupX = e.clientX;
  238.             popupY = e.clientY;
  239.         }
  240.         removeEventListener("popupshowing", disableContextMenu, true)
  241.     }
  242.  
  243.     function izOnMouseDown(e) {
  244.  
  245.         var targetName = e.originalTarget.tagName.toLowerCase();
  246.         if ((targetName == "img" || targetName == "canvas") && (mousedown) && ((e.which == nsIPrefBranchObj.getIntPref("imageresetbutton")) || (e.which == nsIPrefBranchObj.getIntPref("imagefitbutton")) || (e.which == nsIPrefBranchObj.getIntPref("triggerbutton")))) {
  247.             e.preventDefault();
  248.             e.stopPropagation();
  249.         }
  250.  
  251.         // prepare for the mouse functions on a right click when user option is true
  252.         if ((e.which == nsIPrefBranchObj.getIntPref("triggerbutton")) && (nsIPrefBranchObj.getBoolPref("usescroll")) &&
  253.         // Prevent zooming from being initiated when an embedded object is clicked apon
  254.         ! (targetName == "embed" || targetName == "object")) {
  255.  
  256.             if ((targetName == "img" || targetName == "canvas") || (nsIPrefBranchObj.getIntPref("scrollZoomMode") != 2)) {
  257.                 if (nsIPrefBranchObj.getIntPref("scrollZoomMode") == 2) {
  258.                     currentImage = e.originalTarget;
  259.  
  260.                 }
  261.                 if (navigator.platform != "Win32" && navigator.platform != "OS/2") {
  262.                     addEventListener("popupshowing", disableContextMenu, true);
  263.                 }
  264.                 haveZoomed = false;
  265.                 gPanelContainer().addEventListener("DOMMouseScroll", ScrollImage, true);
  266.                 gPanelContainer().addEventListener("mouseup", izOnMouseUp, true);
  267.                 gPanelContainer().addEventListener("click", izOnMouseClick, true);
  268.                 gPanelContainer().addEventListener("mouseout", izOnMouseOut, true);
  269.                 currentURL = window._content.document.location;
  270.                 mousedown = true;
  271.             }
  272.         }
  273.     }
  274.  
  275.     function izOnMouseUp(e) {
  276.         // Right mouse button release, remove listeners
  277.         if (e.which == nsIPrefBranchObj.getIntPref("triggerbutton")) {
  278.             if (haveZoomed) {
  279.                 e.preventDefault();
  280.             }
  281.             cancelScrollZoom();
  282.         }
  283.     }
  284.  
  285.     function izOnMouseClick(e) {
  286.  
  287.         var targetName = e.originalTarget.tagName.toLowerCase();
  288.  
  289.         if (e.which == nsIPrefBranchObj.getIntPref("triggerbutton")) {
  290.             if (haveZoomed) {
  291.                 e.preventDefault();
  292.                 e.stopPropagation();
  293.             } else {
  294.                 // contextmenu on mousedown
  295.                 if (contextDisabled) {
  296.                     document.popupNode = e.originalTarget;
  297.                     try {
  298.                         izContext.showPopup(null, e.screenX, e.screenY, "context", "bottomleft", "topleft");
  299.                     }
  300.                     catch(e) {}
  301.                 }
  302.             }
  303.             cancelScrollZoom();
  304.             gPanelContainer().removeEventListener("click", izOnMouseClick, true);
  305.         }
  306.  
  307.         contextDisabled = false;
  308.  
  309.         if (mousedown) {
  310.             // Invoke varios mouse function when mouse is over an image only
  311.             if (targetName == "img" || targetName == "canvas") {
  312.                 switch (e.which) {
  313.                     // Middle mouse button pressed while right button down, reset image
  314.                 case nsIPrefBranchObj.getIntPref("imageresetbutton"):
  315.                     e.preventDefault();
  316.                     e.stopPropagation();
  317.                     haveZoomed = true;
  318.                     var oizImage = new izImage(e.originalTarget);
  319.                     if (nsIPrefBranchObj.getBoolPref("toggleFitReset") && oizImage.zoomFactor() == 100) {
  320.                         oizImage.fit(nsIPrefBranchObj.getBoolPref("autocenter"));
  321.                     } else {
  322.                         oizImage.setZoom(100);
  323.                     }
  324.                     reportStatus(oizImage);
  325.                     break;
  326.                     // Left mouse button pressed while right button down, fit image to screen
  327.                 case nsIPrefBranchObj.getIntPref("imagefitbutton"):
  328.                     e.preventDefault();
  329.                     e.stopPropagation();
  330.                     haveZoomed = true;
  331.                     var oizImage = new izImage(e.originalTarget);
  332.                     if (nsIPrefBranchObj.getBoolPref("toggleFitReset") && oizImage.isFitted()) {
  333.                         oizImage.setZoom(100);
  334.                     } else {
  335.                         oizImage.fit(nsIPrefBranchObj.getBoolPref("autocenter"));
  336.                     }
  337.                     reportStatus(oizImage);
  338.                     break;
  339.                 }
  340.             } else {
  341.                 gPanelContainer().removeEventListener("click", izOnMouseClick, true);
  342.             }
  343.         }
  344.  
  345.     }
  346.  
  347.     function ScrollImage(e) {
  348.         var imageToScroll;
  349.         // Scroll wheel invoked while right button down, zoom target image
  350.         if ((window._content.document.location == currentURL) && (nsIPrefBranchObj.getBoolPref("usescroll"))) {
  351.             switch (nsIPrefBranchObj.getIntPref("scrollZoomMode")) {
  352.  
  353.                 // Mixed Mode (default)
  354.             case 0:
  355.                 if ((e.target.tagName.toLowerCase() == "img" || e.target.tagName.toLowerCase() == "canvas") || (linuxImage != null) || (currentImage != null)) {
  356.                     if (linuxImage != null) {
  357.                         currentImage = linuxImage;
  358.                     } else if (e.target.tagName.toLowerCase() == "img" || e.target.tagName.toLowerCase() == "canvas") {
  359.                         currentImage = e.target;
  360.                     }
  361.                 } else {
  362.                     currentImage = null;
  363.                 }
  364.                 imageToScroll = currentImage;
  365.                 break;
  366.  
  367.                 // Only Scroll when mouse over image mode
  368.             case 1:
  369.                 if ((e.target.tagName.toLowerCase() == "img" || e.target.tagName.toLowerCase() == "canvas") || (linuxImage != null)) {
  370.                     if (linuxImage != null) {
  371.                         imageToScroll = linuxImage;
  372.                     } else if (e.target.tagName.toLowerCase() == "img" || e.target.tagName.toLowerCase() == "canvas") {
  373.                         imageToScroll = e.target;
  374.                     }
  375.                 } else {
  376.                     imageToScroll = null;
  377.                 }
  378.                 break;
  379.  
  380.                 // Only Scroll the image that was right mouse clicked mode
  381.             case 2:
  382.                 if (currentImage != null) {
  383.                     imageToScroll = currentImage;
  384.                 } else {
  385.                     imageToScroll = null;
  386.                 }
  387.                 break;
  388.             default:
  389.                 imageToScroll = null;
  390.                 break;
  391.             }
  392.  
  393.             if (imageToScroll != null) {
  394.                 e.preventDefault();
  395.                 e.stopPropagation();
  396.                 haveZoomed = true;
  397.                 var oizImage = new izImage(imageToScroll);
  398.  
  399.                 if (nsIPrefBranchObj.getIntPref("scrollmode") == 0) {
  400.                     if (((e.detail < 0) && !nsIPrefBranchObj.getBoolPref("reversescrollzoom")) || ((e.detail > 0) && nsIPrefBranchObj.getBoolPref("reversescrollzoom"))) var zoomFactor = 1 / (1 + (nsIPrefBranchObj.getIntPref("scrollvalue") / 100));
  401.                     else var zoomFactor = 1 + (nsIPrefBranchObj.getIntPref("scrollvalue") / 100);
  402.  
  403.                     oizImage.zoom(zoomFactor);
  404.                 } else {
  405.                     if (((e.detail < 0) && !nsIPrefBranchObj.getBoolPref("reversescrollzoom")) || ((e.detail > 0) && nsIPrefBranchObj.getBoolPref("reversescrollzoom"))) var zoomFactor = oizImage.zoomFactor() - nsIPrefBranchObj.getIntPref("scrollvalue");
  406.                     else var zoomFactor = oizImage.zoomFactor() + nsIPrefBranchObj.getIntPref("scrollvalue");
  407.  
  408.                     oizImage.setZoom(zoomFactor);
  409.                 }
  410.                 reportStatus(oizImage);
  411.             }
  412.         } else {
  413.             cancelScrollZoom();
  414.         }
  415.     }
  416.  
  417.     function insertSeparator(list, position) {
  418.         var beforeShow = false;
  419.         var afterShow = false;
  420.  
  421.         // Check for visable items before the separator
  422.         for (var i = position - 1; i >= 0; i--) {
  423.             if ((list[i].tagName == "menuseparator") && (!list[i].hidden)) break;
  424.             if ((list[i].tagName != "menuseparator") && (!list[i].hidden)) {
  425.                 beforeShow = true;
  426.                 break;
  427.             }
  428.         }
  429.  
  430.         // Check for visable items after the separator
  431.         if (beforeShow) {
  432.             for (var i = position + 1; i < list.length; i++) {
  433.                 if ((list[i].tagName != "menuseparator") && (!list[i].hidden)) {
  434.                     afterShow = true;
  435.                     break;
  436.                 }
  437.             }
  438.         }
  439.  
  440.         // If there are visable items before and after the separator then return true
  441.         return (beforeShow && afterShow);
  442.     }
  443.  
  444.     function imageZoomMenu(e) {
  445.  
  446.         if (net.yellowgorilla.imagezoom.globals.getGeckoVersion() < minGeckoForRotate) {
  447.             var MenuItems = new Array("context-zoom-zin", "context-zoom-zout", "context-zoom-zreset", "context-zoom-zcustom", "context-zoom-dcustom", "context-zoom-fit", "zoomsub-zin", "zoomsub-zout", "zoomsub-zreset", "zoomsub-zcustom", "zoomsub-dcustom", "zoomsub-fit", "zoomsub-z400", "zoomsub-z200", "zoomsub-z150", "zoomsub-z125", "zoomsub-z100", "zoomsub-z75", "zoomsub-z50", "zoomsub-z25", "zoomsub-z10");
  448.             var OptionItems = new Array("mmZoomIO", "mmZoomIO", "mmReset", "mmCustomZoom", "mmCustomDim", "mmFitWindow", "smZoomIO", "smZoomIO", "smReset", "smCustomZoom", "smCustomDim", "smFitWindow", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts");
  449.         } else {
  450.             var MenuItems = new Array("context-zoom-zin", "context-zoom-zout", "context-zoom-zreset", "context-zoom-zcustom", "context-zoom-dcustom", "context-zoom-fit", "context-zoom-rotate-right", "context-zoom-rotate-left", "context-zoom-rotate-180", "context-zoom-rotate-reset", "zoomsub-zin", "zoomsub-zout", "zoomsub-zreset", "rotatesub-rotate-right", "rotatesub-rotate-left", "rotatesub-rotate-180", "rotatesub-rotate-reset", "zoomsub-zcustom", "zoomsub-dcustom", "zoomsub-fit", "zoomsub-z400", "zoomsub-z200", "zoomsub-z150", "zoomsub-z125", "zoomsub-z100", "zoomsub-z75", "zoomsub-z50", "zoomsub-z25", "zoomsub-z10");
  451.             var OptionItems = new Array("mmZoomIO", "mmZoomIO", "mmReset", "mmCustomZoom", "mmCustomDim", "mmFitWindow", "mmRotateRight", "mmRotateLeft", "mmRotate180", "mmRotateReset", "smZoomIO", "smZoomIO", "smReset", "smRotateRight", "smRotateLeft", "smRotate180", "smRotateReset", "smCustomZoom", "smCustomDim", "smFitWindow", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts", "smZoomPcts");
  452.         }
  453.  
  454.         var oizImage = new izImage(document.popupNode);
  455.  
  456.         // Display the correct menu items depending on options and whether an image was clicked
  457.         for (var i = 0; i < MenuItems.length; i++)
  458.         document.getElementById(MenuItems[i]).setAttribute("hidden", ((!gContextMenu.onImage && !gContextMenu.onCanvas) || !nsIPrefBranchObj.getBoolPref(OptionItems[i])));
  459.  
  460.         var subPopUp = document.getElementById("zoompopup");
  461.  
  462.         // Insert the necesary separators if needed in the sub menu
  463.         var subItems = document.getElementById("zoompopup").getElementsByTagName("*");
  464.         for (var i = 0; i < subItems.length; i++) {
  465.             if (subItems[i].tagName == "menuseparator") subItems[i].setAttribute("hidden", !insertSeparator(subItems, i));
  466.         }
  467.  
  468.         var izMenuItem;
  469.  
  470.         // Show the Zoom Image container if there are subitems visible, else hide
  471.         if (subPopUp.getElementsByAttribute("hidden", false).length > 0) {
  472.             izMenuItem = document.getElementById("context-zoomsub")
  473.             izMenuItem.setAttribute("label", getContextSubMenuLabel().replace(/%zoom%/, oizImage.zoomFactor()));
  474.             izMenuItem.setAttribute("hidden", false);
  475.         } else document.getElementById("context-zoomsub").hidden = true;
  476.  
  477.         var rotatePopUp = document.getElementById("rotatepopup");
  478.  
  479.         // Show the Zoom Image container if there are subitems visible, else hide
  480.         if (rotatePopUp.getElementsByAttribute("hidden", false).length > 0) {
  481.             izMenuItem = document.getElementById("context-rotatesub")
  482.             izMenuItem.setAttribute("label", getContextRotateMenuLabel().replace(/%rotate%/, +oizImage.getAngle()));
  483.             izMenuItem.setAttribute("hidden", false);
  484.         } else document.getElementById("context-rotatesub").hidden = true;
  485.     }
  486.  
  487.     function izImage(oImage) {
  488.         var pImage = oImage;
  489.         var enabled = false;
  490.  
  491.         if ((pImage.naturalWidth != 0) || (pImage.naturalHeight != 0) || (pImage.style.width != "") || (pImage.style.height != "") || ((pImage.getAttribute("width")) && (pImage.getAttribute("height")))) {
  492.  
  493.             // If this value is set in the image object, we have zoomed this image before
  494.             if (! (pImage.originalPxWidth) || (!pImage.style.width && !pImage.style.height)) {
  495.                 // Original Width of the image in pixels; Used for calculating zoom factor
  496.                 pImage.originalPxWidth = pImage.width;
  497.                 pImage.originalPxHeight = pImage.height;
  498.  
  499.                 if (!pImage.style.width && !pImage.style.height) {
  500.                     // No style set for image, need to remember original dimensions
  501.                     pImage.originalWidth = pImage.width;
  502.                     pImage.originalWidthUnit = "px";
  503.                     pImage.originalHeight = pImage.height;
  504.                     pImage.originalHeightUnit = "px";
  505.                     pImage.style.width = pImage.originalWidth + pImage.originalWidthUnit;
  506.                     pImage.style.height = pImage.originalHeight + pImage.originalHeightUnit;
  507.                 } else {
  508.                     if (pImage.style.width) {
  509.                         // Remember the original width settings
  510.                         pImage.originalWidth = getDimInt(pImage.style.width);
  511.                         pImage.originalWidthUnit = getDimUnit(pImage.style.width);
  512.                         pImage.style.width = pImage.originalWidth + pImage.originalWidthUnit;
  513.                     }
  514.  
  515.                     if (pImage.style.height) {
  516.                         // Remember the original height settings
  517.                         pImage.originalHeight = getDimInt(pImage.style.height);
  518.                         pImage.originalHeightUnit = getDimUnit(pImage.style.height);
  519.                         pImage.style.height = pImage.originalHeight + pImage.originalHeightUnit;
  520.                     }
  521.                 }
  522.  
  523.                 pImage.zoomFactor = 100;
  524.                 pImage.pageFactor = 100;
  525.                 pImage.autoFitBefore = 0;
  526.                 pImage.angle = 0;
  527.             }
  528.  
  529.             enabled = true;
  530.         }
  531.  
  532.         izImage.prototype.getWidth = getWidth;
  533.         izImage.prototype.getAngle = getAngle;
  534.         izImage.prototype.getHeight = getHeight;
  535.         izImage.prototype.setZoom = setZoom;
  536.         izImage.prototype.setZoomPage = setZoomPage;
  537.         izImage.prototype.setDimension = setDimension;
  538.         izImage.prototype.zoom = zoom;
  539.         izImage.prototype.fit = fit;
  540.         izImage.prototype.rotate = rotate;
  541.         izImage.prototype.activateAutoFit = activateAutoFit;
  542.         izImage.prototype.disactivateAutoFit = disactivateAutoFit;
  543.         izImage.prototype.zoomFactor = zoomFactor;
  544.         izImage.prototype.pageFactor = pageFactor;
  545.         izImage.prototype.getStyleWidth = getStyleWidth;
  546.         izImage.prototype.getStyleHeight = getStyleHeight;
  547.         izImage.prototype.isFitted = isFitted;
  548.  
  549.         // Returns the pixel width of the image
  550.  
  551.  
  552.         function getWidth() {
  553.             return pImage.width;
  554.         }
  555.  
  556.  
  557.         function getStyleWidth() {
  558.             return pImage.style.width;
  559.         }
  560.  
  561.         function getStyleHeight() {
  562.             return pImage.style.height;
  563.         }
  564.  
  565.         // Returns the pixel height of the image
  566.  
  567.  
  568.         function getHeight() {
  569.             return pImage.height;
  570.         }
  571.  
  572.         // Returns the current rotatation angle of the image
  573.  
  574.  
  575.         function getAngle() {
  576.             return pImage.angle;
  577.         }
  578.  
  579.         // Zoom to a factor of the original image size
  580.  
  581.  
  582.         function setZoom(factor) {
  583.             // factors less than zero are invalid
  584.             if ((factor > 0) && (enabled)) {
  585.                 pImage.zoomFactor = factor;
  586.                 pImage.autoFitBefore = 0;
  587.                 pZoomAbs();
  588.             }
  589.         }
  590.  
  591.         // Zoom to a factor of the original image size
  592.  
  593.  
  594.         function setZoomPage(factor) {
  595.             // factors less than zero are invalid
  596.             if ((factor > 0) && (enabled)) {
  597.                 pImage.pageFactor = factor;
  598.                 pZoomAbs();
  599.             }
  600.         }
  601.  
  602.         // Set the dimension of the image
  603.  
  604.  
  605.         function setDimension(width, height) {
  606.             if (enabled) {
  607.                 pImage.style.width = width + "px";
  608.                 pImage.style.height = height + "px";
  609.                 pImage.zoomFactor = ((pImage.width / (pImage.pageFactor / 100)) / pImage.originalPxWidth) * 100;
  610.             }
  611.         }
  612.  
  613.         function zoom(factor) {
  614.             if (enabled) {
  615.  
  616.                 pImage.zoomFactor = pImage.zoomFactor * factor
  617.                 pImage.autoFitBefore = 0;
  618.                 // Zoom the width style if it exists
  619.                 if (pImage.style.width) {
  620.                     var origWidth = getDimInt(pImage.style.width);
  621.                     pImage.style.width = (origWidth * factor) + getDimUnit(pImage.style.width);
  622.                 }
  623.  
  624.                 // Zoom the height style if it exists
  625.                 if (pImage.style.height) {
  626.                     var origHeight = getDimInt(pImage.style.height);
  627.                     pImage.style.height = (origHeight * factor) + getDimUnit(pImage.style.height);
  628.  
  629.                 }
  630.             }
  631.         }
  632.  
  633.         function activateAutoFit() {
  634.             pImage.autoFitBefore = this.zoomFactor();
  635.             this.fit();
  636.         }
  637.  
  638.         function disactivateAutoFit() {
  639.             if (pImage.autoFitBefore != 0) {
  640.                 this.setZoom(pImage.autoFitBefore);
  641.             }
  642.         }
  643.  
  644.         function rotate(degrees) {
  645.  
  646.             if (degrees >= 0) {
  647.                 var theta = (Math.PI * degrees) / 180;
  648.             } else {
  649.                 var theta = (Math.PI * (360 + degrees)) / 180;
  650.             }
  651.             var costheta = Math.cos(theta);
  652.             var sintheta = Math.sin(theta);
  653.  
  654.             var canvas = pImage.ownerDocument.createElement("canvas");
  655.  
  656.             // Set the new width of the image
  657.             canvas.width = Math.abs(costheta * pImage.naturalWidth) + Math.abs(sintheta * pImage.naturalHeight);
  658.  
  659.             // Set the new height of the image
  660.             canvas.height = Math.abs(costheta * pImage.naturalHeight) + Math.abs(sintheta * pImage.naturalWidth);
  661.  
  662.             canvas.oImage = new Image();
  663.  
  664.             if (pImage.tagName.toLowerCase() == "canvas") {
  665.                 canvas.oImage.src = pImage.toDataURL();
  666.             } else {
  667.                 canvas.oImage.src = pImage.src;
  668.             }
  669.  
  670.             canvas.oImage.onload = function () {
  671.  
  672.                 var ctx = canvas.getContext("2d");
  673.                 ctx.save();
  674.  
  675.                 if (theta <= Math.PI / 2) {
  676.                     ctx.translate(sintheta * canvas.oImage.naturalHeight, 0);
  677.                 } else if (theta <= Math.PI) {
  678.                     ctx.translate(canvas.width, -costheta * canvas.oImage.naturalHeight);
  679.                 } else if (theta <= 1.5 * Math.PI) {
  680.                     ctx.translate(-costheta * canvas.oImage.naturalWidth, canvas.height);
  681.                 } else {
  682.                     ctx.translate(0, -sintheta * canvas.oImage.naturalWidth);
  683.                 }
  684.  
  685.                 var tmpOriginalPxWidth = Math.abs(costheta * pImage.originalPxWidth) + Math.abs(sintheta * pImage.originalPxHeight);
  686.                 var tmpOriginalPxHeight = Math.abs(costheta * pImage.originalPxHeight) + Math.abs(sintheta * pImage.originalPxWidth);
  687.                 pImage.originalPxWidth = tmpOriginalPxWidth;
  688.                 pImage.originalPxHeight = tmpOriginalPxHeight;
  689.                 var tmpOriginalWidth = Math.abs(costheta * pImage.originalWidth) + Math.abs(sintheta * pImage.originalHeight);
  690.                 var tmpOriginalHeight = Math.abs(costheta * pImage.originalHeight) + Math.abs(sintheta * pImage.originalWidth);
  691.                 pImage.originalWidth = tmpOriginalWidth
  692.                 pImage.originalHeight = tmpOriginalHeight
  693.                 var tmpStypeWidth = Math.abs(costheta * getDimInt(pImage.style.width)) + Math.abs(sintheta * getDimInt(pImage.style.height));
  694.                 var tmpStyleHeight = Math.abs(costheta * getDimInt(pImage.style.height)) + Math.abs(sintheta * getDimInt(pImage.style.width));
  695.                 pImage.style.width = tmpStypeWidth + pImage.originalWidthUnit
  696.                 pImage.style.height = tmpStyleHeight + pImage.originalHeightUnit
  697.  
  698.                 if (degrees < 0) {
  699.                     pImage.angle = (pImage.angle + 360 + (degrees % 360)) % 360
  700.                 } else {
  701.                     pImage.angle = (pImage.angle + degrees) % 360
  702.                 }
  703.  
  704.  
  705.                 ctx.rotate(theta);
  706.                 ctx.clearRect(0, 0, canvas.oImage.naturalWidth, canvas.oImage.naturalHeight);
  707.                 ctx.drawImage(canvas.oImage, 0, 0, canvas.oImage.naturalWidth, canvas.oImage.naturalHeight);
  708.                 ctx.restore();
  709.  
  710.                 pImage.src = canvas.toDataURL();
  711.  
  712.                 CallBackStatus();
  713.             }
  714.  
  715.         }
  716.  
  717.         function isFitted() {
  718.             var bScreen = new browserScreen(pImage);
  719.  
  720.             // First calculate the size of the client area of the browser depending on mode
  721.             var screenHeight = bScreen.getHeight();
  722.             var screenWidth = bScreen.getWidth();
  723.  
  724.             // work out the screen ratio and the image ratio
  725.             var screenDim = screenWidth / screenHeight;
  726.             var imageDim = pImage.width / pImage.height;
  727.  
  728.             if (screenDim < imageDim) {
  729.                 imageDiff = Math.abs(screenWidth - pImage.width);
  730.             } else {
  731.                 imageDiff = Math.abs(screenHeight - pImage.height);
  732.             }
  733.             // First calculate the size of the client area of the browser depending on mode
  734.             if (imageDiff < 50) {
  735.                 return true;
  736.             } else {
  737.                 return false;
  738.             }
  739.         }
  740.  
  741.         function fit(autoScroll) {
  742.             if (enabled) {
  743.  
  744.                 var bScreen = new browserScreen(pImage);
  745.  
  746.                 // First calculate the size of the client area of the browser depending on mode
  747.                 var screenHeight = bScreen.getHeight();
  748.                 var screenWidth = bScreen.getWidth();
  749.  
  750.                 // work out the screen ratio and the image ratio
  751.                 var screenDim = screenWidth / screenHeight;
  752.                 var imageDim = pImage.width / pImage.height;
  753.  
  754.                 // How we zoom depends on the ratio of the image to the screen
  755.                 if (screenDim < imageDim) {
  756.                     setDimension(screenWidth, parseInt(screenWidth / imageDim + 0.5));
  757.                 } else {
  758.                     setDimension(parseInt(screenHeight * imageDim + 0.5), screenHeight);
  759.                 }
  760.  
  761.                 // In case scrollbars have been introduced, do the image fit again
  762.                 var screenHeight = bScreen.getHeight();
  763.                 var screenWidth = bScreen.getWidth();
  764.  
  765.                 if (screenDim < imageDim) {
  766.                     setDimension(screenWidth, parseInt(screenWidth / imageDim + 0.5));
  767.                 } else {
  768.                     setDimension(parseInt(screenHeight * imageDim + 0.5), screenHeight);
  769.                 }
  770.  
  771.                 pImage.zoomFactor = ((pImage.width / (pImage.pageFactor / 100)) / pImage.originalPxWidth) * 100;
  772.  
  773.                 // Scroll the browser screen to put the image in the center if requested
  774.                 if (autoScroll) {
  775.                     var iTop = 0;
  776.                     var iLeft = 0;
  777.                     var cNode = pImage;
  778.  
  779.                     // Get the distances of the image object from the browser edges
  780.                     while (cNode.tagName != 'BODY') {
  781.                         iLeft += cNode.offsetLeft;
  782.                         iTop += cNode.offsetTop;
  783.                         cNode = cNode.offsetParent;
  784.                     }
  785.  
  786.                     // Now scroll the browser
  787.                     if (screenDim < imageDim) {
  788.                         pImage.ownerDocument.defaultView.scroll(iLeft - (bScreen.getPad()), iTop - ((screenHeight - getDimInt(pImage.style.height)) / 2) - (bScreen.getPad()));
  789.                     } else {
  790.                         pImage.ownerDocument.defaultView.scroll(iLeft - ((screenWidth - getDimInt(pImage.style.width)) / 2) - (bScreen.getPad()), iTop - (bScreen.getPad()));
  791.                     }
  792.                 }
  793.             }
  794.         }
  795.  
  796.         function zoomFactor() {
  797.             return parseInt(parseInt(pImage.zoomFactor) + 0.5);
  798.         }
  799.  
  800.         function pageFactor() {
  801.             return pImage.pageFactor;
  802.         }
  803.  
  804.         function pZoomAbs() {
  805.             // only set the width style if it was originally set
  806.             if (pImage.originalWidth) {
  807.                 pImage.style.width = (pImage.originalWidth * ((pImage.pageFactor / 100) * (pImage.zoomFactor / 100))) + pImage.originalWidthUnit;
  808.             } else {
  809.                 pImage.style.width = "";
  810.             }
  811.             // only set the height style if it was originally set
  812.             if (pImage.originalHeight) {
  813.                 pImage.style.height = (pImage.originalHeight * ((pImage.pageFactor / 100) * (pImage.zoomFactor / 100))) + pImage.originalHeightUnit;
  814.             } else {
  815.                 pImage.style.height = "";
  816.             }
  817.         }
  818.  
  819.         // PRIVATE UTILITY FUNCTIONS
  820.         // Gets the dimension unit from the style property passed as the sText variable
  821.  
  822.  
  823.         function getDimUnit(sText) {
  824.             var ValidChars = "0123456789.";
  825.             var returnChar = "";
  826.             var Char;
  827.  
  828.             for (i = 0; i < sText.length; i++) {
  829.                 Char = sText.charAt(i);
  830.                 if (ValidChars.indexOf(Char) == -1) {
  831.                     returnChar += Char;
  832.                 }
  833.             }
  834.             return returnChar;
  835.         }
  836.  
  837.         // Gets the dimension Value from the style property passed as the sText variable
  838.  
  839.  
  840.         function getDimInt(sText) {
  841.             var ValidChars = "0123456789.";
  842.             var returnChar = "";
  843.             var Char;
  844.  
  845.             for (i = 0; i < sText.length; i++) {
  846.                 Char = sText.charAt(i);
  847.                 if (ValidChars.indexOf(Char) >= 0) {
  848.                     returnChar += Char;
  849.                 }
  850.             }
  851.             return returnChar;
  852.         }
  853.  
  854.         function browserScreen(pImage) {
  855.             var padValue = 17;
  856.  
  857.             browserScreen.prototype.getWidth = getWidth;
  858.             browserScreen.prototype.getHeight = getHeight;
  859.             browserScreen.prototype.getPad = getPad;
  860.  
  861.             function getWidth() {
  862.                 if (pImage.ownerDocument.compatMode == "BackCompat") {
  863.                     var screenWidth = pImage.ownerDocument.body.clientWidth - padValue;
  864.                 } else {
  865.                     var screenWidth = pImage.ownerDocument.documentElement.clientWidth - padValue;
  866.                 }
  867.  
  868.                 return screenWidth;
  869.             }
  870.  
  871.             function getHeight() {
  872.                 if (pImage.ownerDocument.compatMode == "BackCompat") {
  873.                     var screenHeight = pImage.ownerDocument.body.clientHeight - padValue;
  874.                 } else {
  875.                     var screenHeight = pImage.ownerDocument.documentElement.clientHeight - padValue;
  876.                 }
  877.  
  878.                 return screenHeight;
  879.             }
  880.  
  881.             function getPad() {
  882.                 return padValue / 2;
  883.             }
  884.  
  885.         }
  886.  
  887.     }
  888.  
  889. }
  890.  
  891. window.addEventListener("load", net.yellowgorilla.imagezoom.overlay.initImageZoom, false);